package com.sxj.shop.service.impl;

import com.sxj.shop.dao.UserDao;
import com.sxj.shop.entity.User;
import com.sxj.shop.exception.*;
import com.sxj.shop.factory.ObjectFactory;
import com.sxj.shop.service.UserService;
import com.sxj.shop.util.MD5Util;
import com.sxj.shop.util.ParameterUtil;

public class UserServiceImpl implements UserService {

    private UserDao userDao = (UserDao) ObjectFactory.getObject("userDao");

    @Override
    public void register(String username, String password, String phone, String address) throws RequestParameterErrorException, UserExistException {
        // 1.参数校验:非空校验、正则校验等
        if (ParameterUtil.isNull(username) || ParameterUtil.isNull(password) || ParameterUtil.isNull(phone) || ParameterUtil.isNull(address)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 2.业务校验,例如:用户名不能重复
        // 根据用户名查询用户信息,判断该用户是否已经被注册
        User selectUser = userDao.selectByUsername(username);
        // 如果查询到对应的用户信息,说明用户名已经存在
        if (selectUser != null) {
            // 抛出异常,用户已经被注册
            throw new UserExistException("该用户已经被注册,请更换一个");
        }

        // 如果为null,说明该用户没有被注册,执行注册的业务
        // 3.注册,调用持久层执行注册功能
        // 密码需要使用MD5加密
        User user = new User(username, MD5Util.md5(password), phone, address);
        userDao.insertUser(user);
    }

    @Override
    public User login(String username, String password) throws RequestParameterErrorException, UserNotExistException {
        if (ParameterUtil.isNull(username) || ParameterUtil.isNull(password)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 调用dao方法查询信息,密码需要加密
        User user = userDao.selectByUsernameAndPassword(username, MD5Util.md5(password));
        if (user == null) {
            throw new UserNotExistException("用户名或密码错误");
        }
        // 上述可以分为两步
        // 1.根据用户名查询用户信息,如果没有查询到,可以抛出用户名不存在
        // 2.如果查询到了,则比较查询到的密码与当前密码是否一致,如果不一致,则抛出密码错误
        return user;
    }

    @Override
    public void modifyPassword(User user, String oldPassword, String newPassword, String newPassword2) throws UserNotLoginException, RequestParameterErrorException, PasswordErrorException {
        // 1.用户必须登录
        if (user == null) {
            throw new UserNotLoginException("请先登录");
        }
        // 2.请求参数不能为空
        if (ParameterUtil.isNull(oldPassword) || ParameterUtil.isNull(newPassword) || ParameterUtil.isNull(newPassword2)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 3.原密码要正确
        if (!MD5Util.md5(oldPassword).equals(user.getPassword())) {
            throw new PasswordErrorException("原密码不正确");
        }

        // 4.两次输入密码要一致
        if (!newPassword.equals(newPassword2)) {
            throw new PasswordErrorException("两次输入密码不一致");
        }
        // 调用持久层修改密码
        userDao.updatePassword(user.getId(), MD5Util.md5(newPassword));
    }
}
